package com.itheima.rabbitmq.ps;

import com.itheima.rabbitmq.utils.ConnectionUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * @author : [chenxys]
 * @version : [v1.0]
 * @Description : 发布与订阅使用的交换机类型为：fanout
 * @createTime : [2022/6/22 20:14]
 */
public class Producer {
    //交换机名称
    static final String FANOUT_EXCHAGE = "fanout_exchange";
    //队列名称
    static final String FANOUT_QUEUE_1 = "fanout_queue_1";
    //队列名称
    static final String FANOUT_QUEUE_2 = "fanout_queue_2";

    public static void main(String[] args) throws Exception {
        // 创建连接
        Connection connection = ConnectionUtil.getConnection();

        // 创建channel
        Channel channel = connection.createChannel();

        // 声明交换机             交换机名称      交换机类型
        /*exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments)
        * 参数：
        * 1、exchange：交换机名称
        * 2、type：交换机类型
        *       * DIRECT("direct")：定向
        *       * FANOUT("fanout")：扇形[广播:当前交换机会将信息发送给与之绑定的所有队列]
        *       * TOPIC("topic")：通配符方式
        *       * HEADERS("headers")：参数匹配
        * 3、durable：是否持久化
        * 4、autoDelete：自动删除
        * 5、internal：内部使用[一般为false]
        * 6、arguments：参数
        * */
        //channel.exchangeDeclare(FANOUT_EXCHAGE, BuiltinExchangeType.FANOUT);
        channel.exchangeDeclare(FANOUT_EXCHAGE,BuiltinExchangeType.FANOUT,true,false,false,null);
        // 声明（创建）队列
        /**
         * 参数1：队列名称
         * 参数2：是否定义持久化队列
         * 参数3：是否独占本次连接
         * 参数4：是否在不使用的时候自动删除队列
         * 参数5：队列其它参数
         */
        channel.queueDeclare(FANOUT_QUEUE_1,true,false,false,null);
        channel.queueDeclare(FANOUT_QUEUE_2,true,false,false,null);

        //队列绑定交换机     队列名称        交换机名称       路由键[默认为空字符串]
       /* queueBind(String queue, String exchange, String routingKey)
        * 参数：
        *   1、queue：队列名称
        *   2、exchange：交换机名称
        *   3、routingKey：路由键。绑定规则
        *       * 如果交换机的类型为FANOUT，routingKey设置为""
        */
        channel.queueBind(FANOUT_QUEUE_1,FANOUT_EXCHAGE,"");
        channel.queueBind(FANOUT_QUEUE_2,FANOUT_EXCHAGE,"");

        for (int i = 0; i <= 10; i++) {
            // 发送信息
            String message = "你好,小兔子。开启发布订阅模式--" + i;
            /**
             * 参数1：交换机名称，如果没有指定则使用默认Default Exchage
             * 参数2：路由key,简单模式可以传递队列名称
             * 参数3：消息其它属性
             * 参数4：消息内容
             */
            channel.basicPublish(FANOUT_EXCHAGE,"",null,message.getBytes());
        }

        // 关闭资源
        channel.close();
        connection.close();
    }
}
